﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.ComponentModel;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.ObjectModel;
using System.Xml;

using KELT.KELTObjects.LibraryObjectModel;
using KELT.ErrorControl;
using System.Windows.Documents;

namespace KELT.KELTObjects
{
    enum tag_OBJTYPE { IMAGE, SOUND, TEXT };    // 오브젝트들이 그룹으로 이루어질때 구분할 enum 값
    
    public class ObjManager
    {
        private static ObservableCollection<KELT_OBJ> m_ImageList = new ObservableCollection<KELT_OBJ>();      // 이미지 객체 저장 list
        private static ObservableCollection<KELT_OBJ> m_SoundList = new ObservableCollection<KELT_OBJ>();      // 사운드 객체 저장 list
        private static ObservableCollection<KELT_OBJ> m_TextList = new ObservableCollection<KELT_OBJ>();       // 텍스트 객체 저장 list

        private static ObservableCollection<KELT_OBJ> m_SelectList = new ObservableCollection<KELT_OBJ>();       // 텍스트 객체 저장 list

        public ObjManager()
        {
            init();
        }

        // 초기화 함수 모든 변수 초기화 시킬 것.
        public void init()
        {
            m_ImageList.Clear();
            m_SoundList.Clear();
            m_TextList.Clear();
            m_SelectList.Clear();
        }

        #region ObservableCollection
        public ObservableCollection<KELT_OBJ> TextList
        {
            get { return m_TextList; }
            set { m_TextList = value; }
        }

        public ObservableCollection<KELT_OBJ> ImageList
        {
            get { return m_ImageList; }
            set { m_ImageList = value; }
        }

        public ObservableCollection<KELT_OBJ> SoundList
        {
            get { return m_SoundList; }
            set { m_SoundList = value; }
        }

        public ObservableCollection<KELT_OBJ> selectList
        {
            get { return m_SelectList; }
            set { m_SelectList = value; }
        }
        #endregion

        public void ClearSelectList()
        {   
                selectList.Clear();
        }
        public void SelectObject(IList list)
        {
            if (list == null) return;

            for (int i = 0; i < list.Count; i++)
            {
                KELT_OBJ keltOBJ = (list[i] as KELT_OBJ);

                selectList.Add(keltOBJ);
            }
        
        }

        #region CreateObject
        public void CreateImageObj(string path, KELT_OBJ obj, float posx, float posy, float posz, float angle, float width, float height, string ani)
        {
            // 이미지 객체 파일 경로와 파일 이름 셋팅
            ImageObj iobj = (ImageObj)obj;
            iobj.fileFullPath = path;

            
            //imangeobj.FileRoot = path;
            //imangeobj.FileName = path.Substring(path.LastIndexOf("\\") + 1);

            //// 이미지 객체에 추가 정보 셋팅
            //imangeobj.PosX = posx;
            //imangeobj.PosY = posy;
            //imangeobj.PosZ = posz;
            //imangeobj.Angle = angle;
            //imangeobj.Width = width;
            //imangeobj.Heigth = height;
            //imangeobj.AnimationType = ani;

            // 이미지 객체 list에 추가 
            m_ImageList.Add(obj);
        }

        public void CreateSoundObj(string path, KELT_OBJ obj, float posx, float posy, float posz, float angle, float width, float height, string ani)
        {
            // 사운드 객체 파일 경로와 파일 이름 셋팅
            SoundObj sobj = (SoundObj)obj;
            sobj.fileFullPath = path;

            //soundobj.FileRoot = path;
            //soundobj.FileName = path.Substring(path.LastIndexOf("\\") + 1);

            //// 사운드 객체에 추가 정보 셋팅
            //soundobj.PosX = posx;
            //soundobj.PosY = posy;
            //soundobj.PosZ = posz;
            //soundobj.Angle = angle;
            //soundobj.Width = width;
            //soundobj.Heigth = height;
            //soundobj.AnimationType = ani;

            // 사운드 객체 list에 추가
            m_SoundList.Add(obj);
        }

        public void CreateTextObj(string path, KELT_OBJ textobj, string text, float posx, float posy, float posz, float angle, float width, float height, string ani)
        {
            // 텍스트 객체 파일 경로와 파일 이름 셋팅
            
            //textobj.FileRoot = path;
            //textobj.FileName = path.Substring(path.LastIndexOf("\\") + 1);
            /*
            // 텍스트 객체에 추가 정보 셋팅
            textobj.PosX = posx;
            textobj.PosY = posy;
            textobj.PosZ = posz;
            textobj.Angle = angle;
            textobj.Width = width;
            textobj.Heigth = height;
            textobj.AnimationType = ani;
             * */
            // 텍스트 객체 텍스트 내용 셋팅
            ((TextObj)textobj).StrText = text;
            // 텍스트 객체 list에 추가
            m_TextList.Add(textobj);

        }
        #endregion

        #region obj
        private KELT_OBJ m_rootObject = new KELT_OBJ();

        public ObservableCollection<KELT_OBJ> ObjectList
        {
            get { return m_rootObject.ObjectList; }
        }

        void NotifyPropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
        }
        #endregion

        #region page
        //private readonly PageCollection m_PageList;
        //public PageCollection PageList
        //{
        //    get { return m_PageList; }
        //}
        #endregion

        #region XML
        public void GetLibraryXML(XmlWriter writer)
        {
            writer.WriteStartElement("LibraryObjectManage");
            {
                try
                {
                    writer.WriteStartElement("ImageObjects");
                    {
                        for (int i = 0; i < m_ImageList.Count; i++)
                        {
                            m_ImageList[i].GetObjXML(writer);
                        }
                    }
                    writer.WriteEndElement();
                }
                catch (Exception e)
                {
                    ErrorManager.Instance.RecordError(e);
                }
                

                writer.WriteStartElement("SoundObjects");
                {
                    try
                    {
                        for (int i = 0; i < m_SoundList.Count; i++)
                        {
                            m_SoundList[i].GetObjXML(writer);
                        }
                    }
                    catch (Exception e)
                    {
                        ErrorManager.Instance.RecordError(e);
                    }
 
                }
                writer.WriteEndElement();

                writer.WriteStartElement("TextObjects");
                {
                    try
                    {
                        for (int i = 0; i < m_TextList.Count; i++)
                        {
                            m_TextList[i].GetObjXML(writer);
                        }
                    }
                    catch (Exception e)
                    {
                        ErrorManager.Instance.RecordError(e);
                    }

                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
        }

        public void SetLibraryFromXML()
        {

        }
        #endregion
        public event PropertyChangedEventHandler PropertyChanged;
    }
        
}
